package com.mlh.array;

//整数数组 nums 按升序排列，数组中的值 互不相同 。
//在传递给函数之前，nums 在预先未知的某个下标 k（0 <= k < nums.length）上进行了 旋转，
//使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]（下标 从 0 开始 计数）。
//例如， [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。

//给你 旋转后 的数组 nums 和一个整数 target ，如果 nums 中存在这个目标值 target ，则返回它的下标，否则返回 -1 。
//你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

//输入：nums = [4,5,6,7,0,1,2], target = 0
//输出：4

public class 搜索旋转排序数组 {
	//二分查找是针对升序排序的
	//这个题目通过旋转打乱了这一特性，但又具备部分的升序排序
	public static int method1(int[] nums, int target) {
		int n = nums.length;
		if (n == 0) {
			return -1;
		}
		if (n == 1) {
			return nums[0] == target ? 0 : -1;
		}
		int l = 0, r = n - 1;
		while (l <= r) {
			int mid = (l + r) / 2;
			if (nums[mid] == target) {
				return mid;
			}
			if (nums[0] <= nums[mid]) {
				if (nums[0] <= target && target < nums[mid]) {
					r = mid - 1;
				} else {
					l = mid + 1;
				}
			} else {
				if (nums[mid] < target && target <= nums[n - 1]) {
					l = mid + 1;
				} else {
					r = mid - 1;
				}
			}
		}
		return -1;
	}

	//很傻逼  自己做了2个小时  说实话 不如题解一半
	public static int practice(int[] nums, int target) {
		int len=nums.length;
		int left=0,right=len-1;
		while(left<=right){
			int mid=(left+right)/2;
			if(nums[mid]==target){
				return mid;
			}
			if(nums[mid]>nums[right]){
				if(nums[mid]<target){
					left=mid+1;
				}else{
					if(target>nums[right]){
						right=mid-1;
					}else{
						left=mid+1;
					}
				}
			}else{
				if(nums[mid]>target){
					right=mid-1;
				}else{
					if(target>nums[right]){
						right=mid-1;
					}else {
						left=mid+1;
					}
				}
			}
		}
		return -1;
	}
}
